package log

import "fmt"

// 基于日志场景的配置器模式示例

// 假定我们当前已经有一套日志系统

// Logger 日志接口
type Logger interface {
	// Log 日志方法 假定只打印日志
	Log(message string)
}

func NewLogger(loggerType string) Logger {
	switch loggerType {
	case "console":
		return &ConsoleLogger{}
	case "zap":
		return NewZapLoggerAdapter()
	default:
		return NewZapLoggerAdapter()
	}
}

// ConsoleLogger 假定当前只有ConsoleLogger一种日志记录器
type ConsoleLogger struct {
}

func (c *ConsoleLogger) Log(message string) {
	fmt.Println("console log:", message)
}


// 假定我们现在在集成zap日志库，但zap的使用方式与当前系统不一致
// 第三方zap日志库（模拟）
type ZapLogger struct {
}
func (z *ZapLogger) Info(message string, fields ...interface{}) {
	if len(fields) > 0 {
		fmt.Printf("zap log: %s %v\n", message, fields)
		return
	}
	fmt.Printf("zap log: %s \n", message)
}

// 我们希望在不改变现有代码的情况下，能够使用zap日志库
// 适配器模式
type ZapLoggerAdapter struct {
	zapLogger *ZapLogger
}
func NewZapLoggerAdapter() *ZapLoggerAdapter {
	return &ZapLoggerAdapter{zapLogger: &ZapLogger{}}
}

// 适配器方法，将zap的Info方法适配为Log方法
func (z *ZapLoggerAdapter) Log(message string) {
	z.zapLogger.Info(message)
}


